package com.atguigu.netty.tcp;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;

import java.nio.charset.Charset;
import java.util.UUID;

/**
 * 自定义一个handler,需要继承netty规定好的ChannelInboundHandlerAdapter
 * 这是该自定义类才能称为是一个handler
 */
public class MyServerHandler2 extends ChannelInboundHandlerAdapter {
    /**
     * 实际读取税局
     * 1：ChannelHandlerContext  上下文对象，含有管道pipeline，通道channel，地址等
     * 2: msg数据
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服务器读取线程号：：" + Thread.currentThread().getName());
        System.out.println("server ctx=" + ctx);
        System.out.println("channel和pipeline的关系");
        ChannelPipeline pipeline = ctx.pipeline();
        Channel channel = ctx.channel();


        // 将msg转ByteBuffer，是netty提供的，不是nio
        ByteBuf msg1 = (ByteBuf) msg;
        System.out.println("客户端发送消息时：" + msg1.toString(Charset.defaultCharset()));
        System.out.println("客户端地址：" + ctx.channel().remoteAddress());
    }

    // 数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // writeAndFlush   write+flush
        // 将数据写入到缓存，并刷新
        // 一般讲，我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端~(>^ω^<)喵1", CharsetUtil.UTF_8));
    }


    //处理异常, 一般是需要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

}
